﻿//using System;
//using System.IO;
//using System.Collections.Generic;
//using System.Linq;
//using System.Text;
//using System.Xml.Serialization;
//using System.IO;
//using System.Xml.Linq;
//using System.Xml;
//using System.Threading;


//namespace Group3.Framework.Extensions
//{
//    public static class ExtensionSerialize
//    {
//        private static Object myLockobj = new Object();

//        /// <summary>
//        /// Generiert eine Liste von Objekten
//        /// </summary>
//        /// <typeparam name="T"></typeparam>
//        /// <param name="t"></param>
//        /// <param name="xml">XmlSourceDatei</param>
//        /// <returns></returns>
//        public static IEnumerable<T> DeserializeFromXml<T>(this T t, Stream xml) 
//        {
//            lock (myLockobj)
//            {
//                try
//                {
//                    IEnumerable<T> result = new List<T>();
//                    XElement root = XElement.Load(xml);

                    
//                    var r = from c in root.Elements() where c.Name == t.GetType().ToString()
//                            select c;

//                    foreach (XElement el in r)
//                    {
//                        T itm = (T)t.GetType()..GetConstructor(new Type[0]).Invoke(new object[0]);
                        
//                        //Dictionary<string, object> propertyvalues = new Dictionary<string, object>();
//                        foreach (var cEl in el.Elements().First().Elements())
//                        {
//                            if (t.GetType().GetProperty(cEl.Name.ToString()).CanWrite && t.GetType().GetProperty(cEl.Name.ToString()).PropertyType.BaseType != typeof(Enum))
//                            {
//                                t.GetType().GetProperty(cEl.Name.ToString()).SetValue(itm, Value(cEl.Value, t.GetType().GetProperty(cEl.Name.ToString()).PropertyType), null);
//                            }
//                        }
//                        (result as List<T>).Add(itm);
//                    }
//                    stream.Close();
//                    return result;
//                }
//                catch { }
//                finally { }
//            }
//            return null;
//        }

//        private static object Value(string p, Type type)
//        {
//            if (type.ToRealType() == typeof(int))
//            {
//                int i = 0;
//                int.TryParse(p, out i);
//                return i;
//            }
//            else if (type.ToRealType() == typeof(decimal))
//            {
//                decimal i = 0;
//                decimal.TryParse(p, out i);
//                return i;
//            }
//            else if (type.ToRealType() == typeof(double))
//            {
//                double i = 0;
//                double.TryParse(p, out i);
//                return i;
//            }
//            else if (type.ToRealType() == typeof(float))
//            {
//                float i = 0;
//                float.TryParse(p, out i);
//                return i;
//            }
//            else if (type.ToRealType() == typeof(bool))
//            {
//                bool i = false;
//                bool.TryParse(p, out i);
//                return i;
//            }
//            else if (type.ToRealType() == typeof(string))
//                return p;
//            else if (type.ToRealType() == typeof(DateTime))
//            {
//                DateTime i = DateTime.MinValue;
//                DateTime.TryParse(p, out i);
//                return i;
//            }
//            else
//                return null;
//        }


//        /// <summary>
//        /// Legt Objekte in XML-Struktur in einer XML-Datei ab.
//        /// </summary>
//        /// <typeparam name="T">Klasse</typeparam>
//        /// <param name="t">Instanz der Klasse</param>
//        /// <param name="DbFile">Xml-Datei</param>
//        public static void SerializeToXml<T>(this T t, string DbFile) 
//        {
//            lock(myLockobj)
//            {
//                try
//                {
//                    XmlSerializer ser = new XmlSerializer(typeof(T));
//                    if (!File.Exists(DbFile) || String.IsNullOrWhiteSpace(File.ReadAllText(DbFile)))
//                    {

//                        XElement el = new XElement("Database");
//                        XmlWriter w = new XmlTextWriter(DbFile, Encoding.UTF8);
//                        el.WriteTo(w);
//                        w.Close();

//                    }
//                    FileStream stream = new FileStream(DbFile, FileMode.OpenOrCreate);

//                    XElement root = XElement.Load(stream);
                     
//                    if (root.Elements(t.GetType().ToString()).Count() > 0)
//                    {
//                        var result = from c in root.Elements(t.GetType().ToString())
//                                     where c.Element(t.GetKey.Replace("|", "..")) != null
//                                     select c;
//                        foreach(var itm in result)
//                            if (itm.Element(t.GetKey.Replace("|", "..")) != null)
//                            {
//                                itm.Remove();
//                            }
//                    }


//                    root.Add(new XStreamingElement(t.GetType().ToString(),
//                                                                           new XStreamingElement(
//                                                                               t.GetKey.Replace("|", ".."),
//                                                                               from c in typeof(T).GetProperties()
//                                                                           select new XElement(c.Name, c.GetValue(t, null)))));
//                    stream.Close();
//                    root.Save(DbFile);
//                }
//                catch  { }
//                finally
//                {

//                }
//            }
           
//        }

//    }
//}
